package com.hust.yuqian.utils;

import com.hust.yuqian.utils.MakeWaterMarkPic;
import com.hust.yuqian.utils.MatrixTools;
import com.hust.yuqian.utils.UsefulData;

/**
 * Created by mmutuyu on 14-1-11.
 * CDMA Spread Spectrum
 */
public class CDMASPSP {
    int N = UsefulData.WATERMARK_HEIGHT;
    int M = UsefulData.image_height;

    MatrixTools matrixTools = new MatrixTools();
    int [][] hadamard = matrixTools.Hadamard(M);//默认 image_height 和 image_width 是一样的, M * M
    int [][] walsh = matrixTools.Walsh(hadamard);

    /**
     *
     * @param info 要生成的水印的内容信息
     */
    public int[][] operation(String info){

        int[][] binaryMatrix = MakeWaterMarkPic.binaryMatrix(info);//128*128的(-1,1) W 矩阵

        int [][][] C = new int [N][N][M];//调制后的N 组结果

        int [][] C_Added = new int [N][M];//调制结果相加后


        //调制
        for(int r = 0; r < N; r++){//binaryMatrix中的第 r 个用户的信息
            for(int s = 0; s < N; s++){
                for(int t = 0; t < M; t++){
                    C[r][s][t] = walsh[r][t] * binaryMatrix[r][s];
                }
            }
        }

        //相加. 此时其它用户的信息可以看做噪声, 而自己的信息是不会丢失的
        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                for(int k = 0; k < M; k++){
                    C_Added[j][k] += C[i][j][k];
                }
            }
        }

        return C_Added;
    }


    /**
     * 对提取出来的水印数组进行 CDMA 解码
     * @param Cextract 提取出来的水印数组
     * @return 解码后的水印图像数组
     */
    public int [][] operation_inverse(int [][] Cextract){
        int [][] result = new int [N][N];

        for(int j = 0; j < N; j++){
            for(int i = 0; i < N; i++){
                for(int k = 0; k < M; k++){
                    result[i][j] += walsh[j][k] * Cextract[i][k];
                }
            }
        }
        return result;
    }


}
